home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / src / OS2 / os2src / sthoster.c < prev   
C/C++ Source or Header  |  1997-08-06  |  2KB  |  133 lines

  1. #include<stdlib.h>
  2. #include<process.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<sys/socket.h>
  6. #include<netinet/in.h>
  7. #include <rpc/types.h>
  8. #include <rpc/xdr.h>
  9.  
  10. #include <pvm3.h>
  11. #include <pvmproto.h> 
  12. #include "../../pmsg.h"
  13. #include "../../task.h"
  14. #include "../../pvmalloc.h"
  15.  
  16. extern int hostertid;                /* from pvmd.c */
  17. extern int pvmmytid;                /* from pvmd.c */
  18.  
  19. static int
  20. hosterforkexec(tid,name, tpp)
  21.     int tid;            /* tid given by hosterexectask */
  22.     char *name;            /* filename */
  23.  
  24.     struct task **tpp;        /* return task context */
  25. {
  26.     int pid=-1;            /* task pid */
  27.     char *argv[2];
  28.     struct task *tp;        /* new task context */
  29.     char *expected_pid;
  30.     char buf[32];
  31.     char *myenv[100];
  32.     char **p, **q;
  33.     struct stat sb;    
  34.     extern int *ptr_nfp;        /* XXX fix this */
  35.  
  36.     if (stat(name, &sb) == -1) 
  37.         return PvmNoFile;
  38.  
  39.     tp = task_new(tid);        
  40.  
  41.     p = myenv;
  42.     q = environ;
  43.     while (*q) {
  44.         *p++ = *q++;       
  45.     }
  46.             /* copy all the environment for 
  47.                      socket stuff and more */
  48.     expected_pid=malloc(20 * sizeof(char));
  49.     sprintf(expected_pid, "PVMEPID=%d", *ptr_nfp);
  50.         
  51.     *p++ = expected_pid;
  52.     *p=0;
  53.     pvmputenv(expected_pid);
  54.     argv[0]=name;
  55.     argv[1]=0;
  56.  
  57.     pid = spawnve(P_NOWAIT,name,argv,myenv); 
  58.     if (pid == -1) {
  59.             pvmlogperror("forkexec_hoster() _spawnve");
  60.             /* task_free(&tp); */
  61.             pvmbailout(0);
  62.             return PvmOutOfRes;
  63.     }
  64.         
  65.     task_setpid(tp,*ptr_nfp);
  66.     *ptr_nfp=*ptr_nfp + 1;
  67.  
  68.     tp->t_flag |= TF_FORKD;
  69.  
  70.     tp->t_a_out = STRALLOC(name);
  71.      
  72.     *tpp = tp;
  73.     return 0;
  74.  
  75. }        
  76.  
  77.  
  78. static int
  79. hostexectasker(file, tid)
  80.     char *file;
  81.     int tid;
  82. {
  83.     int tids = 0;            /* tid from hosterforkexec */
  84.     
  85.     struct pmsg *rmp;
  86.     struct task *tp = 0;
  87.     int err = 0;            /* error code from forkexec */
  88.  
  89.     rmp = mesg_new(0);
  90.     rmp->m_dst = pvmmytid;
  91.     rmp->m_src = pvmmytid;
  92.  
  93.     rmp->m_tag = DM_EXECACK;
  94.  
  95.     if (err = hosterforkexec(tid,file, &tp)) {
  96.         tids = err;
  97.     } else {
  98.             tp->t_ptid = 0;
  99.             tp->t_outtid = 0;
  100.             tp->t_trctid = 0;
  101.             tp->t_sched = 0;
  102.             tids = tp->t_tid;
  103.     }
  104.  
  105.     pkint(rmp, 1);
  106.     pkint(rmp, tids);
  107.     sendmessage(rmp);
  108.     
  109.     return err;
  110. }
  111.  
  112.  
  113. /*    start_hoster()
  114. *    forkexec the hoster process which
  115. *    will start other pvmd's.
  116. *    acts like pvmd'
  117. ***/
  118.  
  119. int start_hoster(int reserved_tid)
  120. {
  121.     char hosterpath[128];
  122.     strcpy(hosterpath,(char*)pvmgetroot());
  123.     strcat(hosterpath,"/bin/OS2/hoster.exe");
  124.  
  125.     if (hostexectasker(hosterpath,reserved_tid)) {
  126.         
  127.         return -1;
  128.     }
  129.     return 0;
  130. }
  131.  
  132.  
  133.